#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include "esp_log.h"
#include "serialdata.h"
#include <stdlib.h>
static const char *TAG = "serialdata";
/*
串口数据格式：
+--------+--------+--------+-------------------+
|  命令  |  命令   | 长度   |      数据          |
| (Byte) | (Byte) | (Byte) | (N Bytes, Length N)|
+--------+--------+--------+-------------------+

说明:
- 命令: 占用2个字节 (16位), 用于标识数据包的功能或类型。
  - 例如: 
  - #define CMDHEAD_WIFICONFIG 0x0A01  //该命令用于启动wifi，长度后面的数据就是ssid、password...
  - #define CMDHEAD_RAWDATA 0x0A02     //原始数据,直接发送

- 长度: 占用1个字节 (8位), 指示随后跟随的数据部分的字节数。
  - 注意: 最大支持的数据长度为 255 字节。
  - 例如: 如果值为 0x0A (十进制 10), 则意味着接下来有 10 个字节的数据。

- 数据: 占用 N 个字节, 其中 N 是由长度字段指定的值。
  - 这部分可以包含任意类型的数据, 如文本、数值等。
  - 例如: 如果长度字段为 0x0A, 数据部分可能包含 10 个字节的文本或二进制数据。

总体数据包大小 = 2 (命令字节) + 1 (长度字节) + N (数据字节)。
*/

// 定义 WiFi SSID 和密码的最大长度
#define MAX_SSID_LEN 32
#define MAX_PASS_LEN 32
#define MAX_IP_LEN 16
#define MAX_PORT_LEN 6

// 定义接收缓冲区的最大长度
#define MAX_RECEIVE_BUFFER 128

/**
 * @brief 解析 SSID 和密码
 * @param packethead 数据
 * @return none
 **/
void parse_credentials(char* packethead) {
    char *token;
    //char *remaining = receive_buffer;
#if 1
    char *remaining=packethead;
    // 提取 SSID
    token = strtok_r(remaining, ",", &remaining);
    if (token != NULL) {
        strncpy(wifiinfo_ssid, token, MAX_SSID_LEN);
        wifiinfo_ssid[MAX_SSID_LEN] = '\0';
    }

    // 提取密码
    token = strtok_r(NULL, ",", &remaining);
    if (token != NULL) {
        strncpy(wifiinfo_password, token, MAX_PASS_LEN);
        wifiinfo_password[MAX_PASS_LEN] = '\0';
    }

    // 提取 IP 地址
    token = strtok_r(NULL, ",", &remaining);
    if (token != NULL) {
        strncpy(wifiinfo_destaddr, token, MAX_IP_LEN);
        wifiinfo_destaddr[MAX_IP_LEN] = '\0';
    }

    // 提取端口号
    token = strtok_r(NULL, ",", &remaining);
    if (token != NULL) {
        strncpy(wifiinfo_port, token, MAX_PORT_LEN);
        wifiinfo_port[MAX_PORT_LEN] = '\0';
    }
    wifinfo_portnum=atoi(wifiinfo_port);

#endif
    // 打印提取的信息
    ESP_LOGI(TAG, "SSID: %s", wifiinfo_ssid);
    ESP_LOGI(TAG, "Password: %s", wifiinfo_password);
    ESP_LOGI(TAG, "IP Address: %s", wifiinfo_destaddr);
    ESP_LOGI(TAG, "Port: %s", wifiinfo_port);
}


//rawdata[0], rawdata[1]是两个命令字符，通过swtichcase控制不同的状态
#define CMDHEAD_WIFICONFIG 0x0A01  // 0x0A << 8 | 0x0A
#define CMDHEAD_RAWDATA 0x0A02  

//#define HEAD_A 0
//#define HEAD_B 1
#define LEN_POSITION 2
#define PACKETHEAD_POSITION 3

/**
 * @brief 处理串口命令、数据
 * @param rawframe 来自串口的命令、数据原始数据
 * @param len      数据长度，最大为128字节
 * @return none
 **/
void Process_Command(char *rawframe,int len) {
    // 将前两个字节作为命令键处理
    int command_key = ((unsigned char)rawframe[0] << 8) | (unsigned char)rawframe[1];
    // 第三个字节表示数据长度
    // unsigned char data_length = rawframe[LEN_POSITION];//现在不要用这个len，是我随便写的
    int data_length = len;
    // ESP_LOGI(TAG, "---Before Switch---");
    switch (command_key) {
        case CMDHEAD_WIFICONFIG:
            
            // ESP_LOGI(TAG, "Received Command AB with data length %u.", data_length);
            // 这里可以添加针对命令 AB 的处理逻辑
            memset(wifiinfo_ssid,0,33);
            memset(wifiinfo_password,0,33);
            parse_credentials(rawframe+PACKETHEAD_POSITION);
            wifi_init_callback(wifiinfo_ssid,wifiinfo_password);
           
            break;
        case CMDHEAD_RAWDATA:
            ESP_LOGI(TAG, "Received Command BC with data length %u.", data_length);
            sendtoUdp_Callback(rawframe+PACKETHEAD_POSITION);
            // 这里可以添加针对命令 BC 的处理逻辑
            break;

        default:
            ESP_LOGI(TAG, "Invalid command key.");
            break;
    }

    // 如果有数据，则处理数据
    if (data_length > 0) {
    ESP_LOGI(TAG, "data len:%d,   data frame:",data_length );
     for (int i = 0; i <data_length; i++) {
     // printf("%02X ", (unsigned char)rawframe[i]);
    }
    printf("\n");
    // 这里可以添加数据处理逻辑
    }
}